//其实ETCD可以被看成一个存储在线服务的数据库，只是存储但不负责提供服务，
//它的性质有点像“工商局”,它可以通知其它想要获取“服务”的应用：你想要的服务是否开放，但是工商局不负责提供服务，只是提供一个注册与通知的功能。
//由于个人设备的限制，只能将etcd服务器，服务提供者，服务请求者安置在一台云服务器上~。

//ETCD服务器，安装好之后直接运行就可以了，这还是比较简单的吧~
//  sudo apt-get install etcd   安装
//  sudo systemctl start etcd   启动
//  sudo systemctl enable etcd  开机自启动
//顺带一提ETCD的集群节点通信端口为2380,客户端访问端口为2379。
//当然这个是可以进行修改的 在/etc/default/etcd 目录下。
//这里记录一下，我没有设置开机自启动。因为鼠鼠我啊，服务器配置不太高，软件都自启动的话会拖慢速度。

//运行验证一下是否安装完毕。
//etcdctl put mykey "this is awesome" （测试）
//No help topic for 'put' （报错：可能是因为没有指定ETCD版本）
//对了！，记得指定一下ETCD的版本 export ETCDCTL_API=3
//如果没指定，指定后记得重新加载一下 source /etc/profile
//然后在执行一下测试命令》

//其实在上面的描述中，我们已经可以知道了ETCD在服务集群中是一个怎样的定位。
//可注册、可通知、可检查(这一点和ETCD的租约机制有关，一会再说~~)。

//ETCD使用
//有一个蛋疼的问题，那就是ETCD是用golang写的，但是我是C++选手啊，
//所以，去找找有没有相关的C++API~~。
//有的，有的

//ETCD——C++ API依赖安装
//sudo apt-get install libboost-all-dev libssl-dev
//sudo apt-get install libprotobuf-dev protobuf-compiler-grpc
//sudo apt-get install libgrpc-dev libgrpc++-dev
//sudo apt-get install libcpprest-dev
//ETCD——C++ API框架安装
//git clone https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3.git cd etcd-cpp-apiv3
//mkdir build
//cd build
//cmake .. -DCMAKE_INSTALL_PREFIX=/usr
//make -j$(nproc) && sudo make install          我靠，直接给哥们服务器干崩了！而且干崩了两次，换了XSHELL试了试，可以，可能VSCODE的占用量也不小


#include <etcd/Client.hpp>
#include <etcd/Response.hpp>
#include <etcd/KeepAlive.hpp>
#include <functional>
#include <thread>
#include <chrono>
#include <string>

void RegistryService(etcd::Client& etcd,const std::string& serviceKey,const std::string& serviceValue,size_t liveTime)
{
    // //异步获取租约
    // int64_t lease_id1=-1;
    // pplx::task<std::shared_ptr<etcd::KeepAlive>> res = etcd.leasekeepalive(liveTime);
    // res.then([&lease_id1](std::shared_ptr<etcd::KeepAlive> res){ lease_id1 = res->Lease();});
    
    // //模拟去做其它的事情  
    // std::this_thread::sleep_for(std::chrono::seconds(2));
    // std::cout<<lease_id1<<std::endl;
    
    // //获取resphone对象(同步获取)
    auto res_lease =  etcd.leasekeepalive(liveTime).get();
    //获取租约ID
    int64_t leaseid =  res_lease->Lease();
    //将键值与租约绑定
    etcd.put(serviceKey,serviceValue,leaseid);
    //休眠该执行流20s
    std::this_thread::sleep_for(std::chrono::seconds(20));
    etcd.leaserevoke(leaseid);
    std::cout<<"程序已退出"<<std::endl;
}

int main()
{
    try
    {    
        etcd::Client etcd("http://127.0.0.1:2379");
        size_t time=20; //单位：秒

        RegistryService(etcd,"/test/test1","127.0.0.1:8888",time);
        RegistryService(etcd,"/test/test2","127.0.0.1:8889",time);
        RegistryService(etcd,"/test/test3","127.0.0.1:8890",time);
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }
    return 0;
}